﻿using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PoJun.Tools.DB.RDBMS
{
    #region MySqlDB基类

    /// <summary>
    /// MySqlDB基类
    /// </summary>
    public class MySqlDBBase
    {
        #region 初始化

        /// <summary>
        /// 获取配置文件中的连接字符串 
        /// </summary>
        protected readonly string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["GMySql"].ConnectionString;

        /// <summary>
        /// 数据库超时时间（默认3分钟如果设置为0代表不限制时间慎用）
        /// </summary>
        protected static readonly int CommandTimeout = 720;

        #endregion

        #region 给MySqlParameter赋值

        /// <summary>
        /// 给SqlCommand赋值
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <param name="Type">类型</param>
        /// <returns></returns>
        protected MySqlCommand GetCommand(string sql, CommandType type)
        {
            //设置Command对象
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = sql;
            cmd.CommandType = type;

            return cmd;
        }

        /// <summary>
        /// 给MySqlParameter赋值
        /// </summary>
        /// <param name="name">存储过程名称</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns></returns>
        protected MySqlCommand GetCommand(string name, CommandType type, params object[] param)
        {
            //设置Command对象
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = name;
            cmd.CommandType = type;

            MySqlParameter[] msp = new MySqlParameter[] { };
            msp = (MySqlParameter[])param;

            //添加参数
            if (msp.Length > 0)
            {
                cmd.Parameters.AddRange(msp);
            }
            return cmd;
        }

        #endregion
    }

    #endregion

    #region MySqlDBHelper - 同步仓储

    /// <summary>
    /// MySqlDBHelper - 同步仓储
    /// </summary>
    [Obsolete("尚未完成，请勿使用")]
    public class MySqlDBHelper : MySqlDBBase, IDBHelper
    {
        #region 执行增（INSERT）删（DELETE）改（UPDATE）语句

        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <param name="connectionString">数据库链接字符串</param>
        /// <returns></returns>
        public int ExecuteCommand(string sql)
        {
            MySqlCommand cmd = null;
            MySqlTransaction trans = null;
            int flag = 0;
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                try
                {
                    //设置Command对象
                    cmd = GetCommand(sql, CommandType.Text);
                    cmd.Connection = conn;
                    //打开连接
                    conn.Open();
                    //开始事物
                    trans = conn.BeginTransaction();
                    cmd.Transaction = trans;
                    //执行命令操作
                    flag = cmd.ExecuteNonQuery();
                    //提交事物
                    trans.Commit();
                    //关闭数据库链接
                    conn.Close();
                }
                catch (Exception e)
                {
                    //回滚事物
                    trans.Rollback();
                    throw e;
                }
                finally
                {
                    //释放资源
                    cmd.Parameters.Clear();
                    conn.Close();
                    cmd.Dispose();
                    if (trans != null)
                    {
                        trans.Dispose();
                    }
                }
            }
            return flag;
        }


        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="connectionString">数据库链接字符串</param>
        /// <param name="param">参数</param>
        /// <returns></returns>
        public int ExecuteCommand(string name, CommandType Type, params object[] param)
        {
            MySqlCommand cmd = null;
            int flag = 0;
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                try
                {
                    //设置Command对象
                    cmd = GetCommand(name, Type, param);
                    cmd.CommandTimeout = CommandTimeout;//设置数据库超时时间(3分钟),如果设置为0代表不限制时间慎用
                    cmd.Connection = conn;
                    //打开连接
                    conn.Open();
                    //开始事物
                    cmd.Transaction = conn.BeginTransaction();
                    //执行命令操作
                    flag = cmd.ExecuteNonQuery();
                    //提交事物
                    cmd.Transaction.Commit();
                    //关闭数据库链接
                    conn.Close();
                }
                catch (Exception e)
                {
                    if (cmd.Transaction != null)
                        cmd.Transaction.Rollback();
                    throw e;
                }
                finally
                {
                    //释放资源
                    cmd.Parameters.Clear();
                    cmd.Dispose();
                }
            }

            return flag;
        }

        #endregion

        #region 执行查询（SELECT）语句，第一行第一列的值

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>int flag</returns>
        public string GetScalar(string sql)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(sql, CommandType.Text))
                {
                    cmd.Connection = conn;
                    //打开连接
                    conn.Open();
                    //执行命令操作
                    string flag = Convert.ToString(cmd.ExecuteScalar());
                    //关闭数据库链接
                    conn.Close();
                    return flag;
                }
            }
        }

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <returns>int flag</returns>
        public string GetScalar(string name, CommandType Type, params object[] param)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(name, Type, param))
                {
                    cmd.Connection = conn;
                    //打开连接
                    conn.Open();
                    string flag = "-1";
                    //执行命令操作
                    flag = Convert.ToString(cmd.ExecuteScalar());
                    //关闭数据库链接
                    conn.Close();
                    return flag;
                }
            }
        }

        #endregion

        #region 执行查询（SELECT）语句，获取填充后数据集

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>DataSet</returns>
        public DataSet GetDataSet(string sql)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(sql, CommandType.Text))
                {
                    using (MySqlDataAdapter sda = new MySqlDataAdapter())
                    {
                        //打开数据库链接
                        conn.Open();
                        cmd.Connection = conn;
                        sda.SelectCommand = cmd;
                        DataSet ds = new DataSet();
                        sda.Fill(ds, "Table");
                        //关闭数据库链接
                        conn.Close();
                        return ds;
                    }
                }
            }
        }

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称或SQL语句</param>
        /// <param name="type">类型</param>
        /// <param name="connectionString">数据库链接字符串</param>
        /// <param name="param">参数</param>
        /// <returns>DataSet</returns>
        public DataSet GetDataSet(string name, CommandType type, params object[] param)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(name, type, param))
                {
                    using (MySqlDataAdapter sda = new MySqlDataAdapter())
                    {
                        //打开数据库链接
                        conn.Open();
                        cmd.Connection = conn;
                        sda.SelectCommand = cmd;
                        DataSet ds = new DataSet();
                        sda.Fill(ds, "Table");
                        //关闭数据库链接
                        conn.Close();
                        return ds;
                    }
                }
            }
        }

        #endregion
    }

    #endregion

    #region MySqlDBHelper - 异步仓储

    /// <summary>
    /// MySqlDBHelper - 异步仓储
    /// </summary>
    [Obsolete("尚未完成，请勿使用")]
    public class MySqlDBHelperAsync : MySqlDBBase, IDBHelperAsync
    {
        #region 执行增（INSERT）删（DELETE）改（UPDATE）语句

        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <param name="connectionString">数据库链接字符串</param>
        /// <returns></returns>
        public async Task<int> ExecuteCommandAsync(string sql)
        {
            MySqlCommand cmd = null;
            MySqlTransaction trans = null;
            int flag = 0;
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                try
                {
                    //设置Command对象
                    cmd = GetCommand(sql, CommandType.Text);
                    cmd.Connection = conn;
                    //打开连接
                    await conn.OpenAsync();
                    //开始事物
                    trans = await conn.BeginTransactionAsync();
                    cmd.Transaction = trans;
                    //执行命令操作
                    flag = await cmd.ExecuteNonQueryAsync();
                    //提交事物
                    trans.Commit();
                    //关闭数据库链接
                    await conn.CloseAsync();
                }
                catch (Exception e)
                {
                    //回滚事物
                    trans.Rollback();
                    throw e;
                }
                finally
                {
                    //释放资源
                    cmd.Parameters.Clear();
                    conn.Close();
                    cmd.Dispose();
                    if (trans != null)
                    {
                        trans.Dispose();
                    }
                }
            }
            return flag;
        }

        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="connectionString">数据库链接字符串</param>
        /// <param name="param">参数</param>
        /// <returns></returns>
        public async Task<int> ExecuteCommandAsync(string name, CommandType Type, params object[] param)
        {
            MySqlCommand cmd = null;
            int flag = 0;
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                try
                {
                    //设置Command对象
                    cmd = GetCommand(name, Type, param);
                    cmd.CommandTimeout = CommandTimeout;//设置数据库超时时间(3分钟),如果设置为0代表不限制时间慎用
                    cmd.Connection = conn;
                    //打开连接
                    await conn.OpenAsync();
                    //开始事物
                    cmd.Transaction = await conn.BeginTransactionAsync();
                    //执行命令操作
                    flag = await cmd.ExecuteNonQueryAsync();
                    //提交事物
                    cmd.Transaction.Commit();
                    //关闭数据库链接
                    await conn.CloseAsync();
                }
                catch (Exception e)
                {
                    if (cmd.Transaction != null)
                        cmd.Transaction.Rollback();
                    throw e;
                }
                finally
                {
                    //释放资源
                    cmd.Parameters.Clear();
                    cmd.Dispose();
                }
            }

            return flag;
        }

        #endregion

        #region 执行查询（SELECT）语句，第一行第一列的值

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>int flag</returns>
        public async Task<string> GetScalarAsync(string sql)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(sql, CommandType.Text))
                {
                    cmd.Connection = conn;
                    //打开连接
                    await conn.OpenAsync();
                    //执行命令操作
                    string flag = Convert.ToString(await cmd.ExecuteScalarAsync());
                    //关闭数据库链接
                    await conn.CloseAsync();
                    return flag;
                }
            }
        }

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <returns>int flag</returns>
        public async Task<string> GetScalarAsync(string name, CommandType Type, params object[] param)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(name, Type, param))
                {
                    cmd.Connection = conn;
                    //打开连接
                    await conn.OpenAsync();
                    string flag = "-1";
                    //执行命令操作
                    flag = Convert.ToString(await cmd.ExecuteScalarAsync());
                    //关闭数据库链接
                    await conn.CloseAsync();
                    return flag;
                }
            }
        }

        #endregion

        #region 执行查询（SELECT）语句，获取填充后数据集

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>DataSet</returns>
        public async Task<DataSet> GetDataSetAsync(string sql)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(sql, CommandType.Text))
                {
                    using (MySqlDataAdapter sda = new MySqlDataAdapter())
                    {
                        //打开数据库链接
                        await conn.OpenAsync();
                        cmd.Connection = conn;
                        DataSet ds = new DataSet();
                        sda.SelectCommand = cmd;
                        await sda.FillAsync(ds, "Table");
                        //关闭数据库链接
                        await conn.CloseAsync();
                        return ds;
                    }
                }
            }
        }

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称或SQL语句</param>
        /// <param name="type">类型</param>
        /// <param name="connectionString">数据库链接字符串</param>
        /// <param name="param">参数</param>
        /// <returns>DataSet</returns>
        public async Task<DataSet> GetDataSetAsync(string name, CommandType type, params object[] param)
        {
            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {
                //设置Command对象
                using (MySqlCommand cmd = GetCommand(name, type, param))
                {
                    using (MySqlDataAdapter sda = new MySqlDataAdapter())
                    {
                        //打开数据库链接
                        await conn.OpenAsync();
                        cmd.Connection = conn;
                        sda.SelectCommand = cmd;
                        DataSet ds = new DataSet();
                        await sda.FillAsync(ds, "Table");
                        //关闭数据库链接
                        await conn.CloseAsync();
                        return ds;
                    }
                }
            }
        }

        #endregion
    }

    #endregion
}